自用VS Code C++环境配置与CMake最简指南与模板 您所在的位置:网站首页 puppy linux中文设置 自用VS Code C++环境配置与CMake最简指南与模板

自用VS Code C++环境配置与CMake最简指南与模板

2023-04-14 06:51| 来源: 网络整理| 查看: 265

本文包含以下内容Linux下在VS Code构建C++开发环境(智能提示与跳转, DEBUG环境等)个人用CMake模板与所需最简的语法前言

刚学C++那会儿, 项目构建给我难倒了

C++的项目构建工具, 我本科时, 最早用的是make, make最基本的就是目标, 命令与依赖三个选项嘛, 看起来简单易懂. 但make个人写起来感觉和写脚本一模一样. 有次有个项目晾着一两星期, 我就看不懂自己写过的Makefile了, 后面我就转向CMake了. 虽然CMake这位更是一言难尽...... 但无奈它先是占据了市场, 现代的构建工具也只能用它.

C++环境构建(不依赖CMake)卸载原有VS Code C++ Extension插件

(估计没啥用的小tips: WSL2下, 如果docker容器本来使用C++插件进行智能提示, 在WSL2下安装clangd后, 可能导致容器下的插件不起作用)

环境工具安装

在Linux终端中安装clangd lldb

sudo apt install clangd lldb

在VS Code中安装clangd和CodeLLDB插件

clangd代码检查依赖一个compile_command.json的文件, 这个文件可以使用cmake来生成, 而如果你的项目使用的是make构建的话, 也有bear来进行生成, 接下来分别将介绍这两种方法.

还有提醒一点就是clangd虽然名字有clang, 但同样支持gcc编译的项目, 甚至是交叉编译的项目(我曾将clangd使用在risc-v上, 体验良好)

使用CMake生成compile_command.json

CMake在指定构建目录的命令中加入以下选项就可以生成compile_command.json (如果你不熟悉CMake, 后文会介绍个人使用的最简CMake项目模板与使用指南)

cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1使用bear生成compile_command.json

先安装bear

sudo apt install bear

使用如下, 在bear命令后加上你原来准备使用的make命令即可在当前目录下看到compile_command.json

make clean && bear make all为clangd指定compile_command.json所在路径

在VS Code右下角打开Settings

搜索clangd, 在Clangd: Arguments指定compile_command.json路径, 由cmake创建的会在构建目录下, 由bear创建的会在当前目录下.

总之, clangd就开始进行工作了.

DEBUG配置

在.vscode文件夹下的launch.json文件是VS Code的debug配置文件, 只要在program栏里写下你的可执行目标文件就可以了, 然后按F5就可以打断点开始调试了.

{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "lldb", "request": "launch", "name": "Debug", "program": "${workspaceFolder}/build/proj/proj", "args": [], "cwd": "${workspaceFolder}" } ] }CMake最简指南与个人用模板

(碎碎念: CMake和C++这俩真是卧龙凤雏......但问题是作为一个项目管理工具, 大部分人花太多时间在CMake上完全不值当. 个人经验教训让我觉得CMake入门只需要懂几个Modern CMake最基本的命令和规则, 然后拿个最简单的项目模板抄抄改改就行了, 真要看大项目的CMakeLists.txt再去细看, 不要像我一样误入弯路)

首先安装cmake

sudo apt install cmake

在VS Code上可以安装个插件作语法高亮, 下面的CMake Tools应该是封装了CMake的一些操作, 想要也可以安装, 但我自己是不用的

cmake会根据当前目录下的CMakeLists.txt的内容来执行构建命令

可以看下示例模板的目录结构, 根目录和子目录proj下各有一个CMakeLists.txt文件, proj目录存放着当前的实际项目, 这种项目结构的好处是之后还可以在根目录下添加与proj平级的项目, proj0, proj1, proj2等等, 方便拓展.

根目录下的CMakeLists.txt如下, 接下来将按行逐条解释

cmake_minimum_required(VERSION 3.16) set(CMAKE_BUILD_TYPE Debug) #set(CMAKE_C_COMPILER "/usr/bin/clang") #set(CMAKE_CXX_COMPILER "/usr/bin/clang++") set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project(proj LANGUAGES CXX) add_subdirectory(proj)

cmake_minimum_required(VERSION3.16) 这一个命令指示编译该项目所需的cmake最小版本号, 你可以使用cmake --version查看当前的cmake版本号, 直接然后照抄就是了.

set(CMAKE_BUILD_TYPE Debug) 这一条命令用于设置项目要不要附带Debug信息进行编译, 设置成Release可以不附带Debug信息进行编译

set(CMAKE_C_COMPILER"/usr/bin/clang") 为CMake设置C编译器clang, 没安装clang可以不写

set(CMAKE_CXX_COMPILER"/usr/bin/clang++") 为CMake设置C++编译器clang++, 没安装clang可以不写

set(CMAKE_CXX_STANDARD 11) 这个命令很明显了, 设置C++的版本, 这里设置为11, 可以选择你喜欢的

set(CMAKE_CXX_STANDARD_REQUIRED ON) 常与上一条命令搭配的命令, 让cmake检查编译器是否符合要求

set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 这个命令是指示cmake导出compile_command.json文件, 还记得吗, 就上文说的用于指导clangd进行智能提示的文件, 你要是不需要也可以去掉该语句或者设置为OFF

project(proj LANGUAGES CXX) 必选命令, 指定当前项目名, LANGUAGES后指示该项目使用什么编程语言(注意是复数LANGUAGES而不是LANGUAGE), CXX代表C++

add_subdirectory(proj) 指示proj目录下还有一个文件夹需要cmake进行处理(注意, 这里的proj与上一条project()命令的proj无关系)

接着看向proj目录下的CMakeLists.txt, 这里很简单, 只有两条有效命令, 还有两条被注释了的链接命令随后便讲.

file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/*.cc include/*.h) # find_package(Eigen3 3.3 REQUIRED NO_MODULE) add_executable(proj ${srcs}) # target_link_libraries(proj PUBLIC Eigen3::Eigen)

file(GLOB_RECURSE srcs CONFIGURE_DEPENDS src/.cc include/.h) file命令是将指定的文件添加到变量中, 这里指定了src目录下的以cc结尾的文件, 和include目录下以.h结尾的文件. (注意, cmake查找相对路径是当前CMakeLists.txt所在的路径) GLOB_RECURSE则是指定递归地寻找, 也就是不仅会搜索src目录下以cc结尾的文件, src下的任何一级子目录下的cc文件都会被加入srcs变量, include/*.h也是同理. 设置CONFIGURE_DEPENDS则会在目录下有新文件加入时, 更新变量.

add_executable(proj ${srcs}) add_executable这条命令新增了一个名为proj(与之前出现的proj无关)的target, 这个target是一个可执行(executable)文件, 它的编译依赖于之前设置的srcs变量.

接下来两条命令则是展示了如何链接库文件, 不需要可以注释掉, 这里使用了Eigen做示范, 如果你的电脑还未安装eigen库, 可以运行sudo apt install libeigen3-dev安装eigen

find_package(Eigen3 3.3 REQUIRED NO_MODULE) find_package命令用于加载外部依赖库, Eigen3 3.3制定了依赖库名和版本好, REQUIRED指明必须找到该库, 否则报错, NO_MODULE则是让CMake使用配置模式进行查找, 默认情况下, CMake在/usr/lib/cmake搜索依赖库对应的*Config.cmake文件, 用它来配置链接库选项, 我在安装Eigen库后, 它就将cmake的配置文件也安装到对应目录里了, 因此这里可以使用find_package找到Eigen

target_link_libraries(proj Eigen3::Eigen) 这条命令是非常重要的, 它指示了将eigen库链接到了之前设置的target proj上, 需要注意的是, 这里不用设置proj需要include的目录, 将target链接到库的时候, Eigen需要对外可见的头文件也被设置在target的include目录下了

(除了CMakeLists.txt之外, 注意proj下的include目录下还有一个同名的proj目录, 这样做的唯一好处是可以用#include, 在创建了和proj同级的target, 例如proj0, proj1, proj2时, 可以更好地区分include了哪个目录下的头文件)

CMake常用的命令行命令

该命令会寻找当前目录下的根CMakeLists.txt, 并创建配置好一个build文件夹, 接下来cmake所有的改动都会在build文件夹下进行, 不污染原项目环境 (这就是所谓的out of tree?)

cmake -B build

还记得之前让cmake生成compile_command.json的命令吗, 如果在CMakeLists.txt里没有写上, 也可以在这一步写好.

cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1

然后就是让cmake进行真正构建的命令了, 用过make的应该都熟悉, -j20是让make使用20个线程进行构建的选项, 这里的-j20, cmake会将它传给真正的构建工具make, 让make使用-j20选项

cmake --build build -j20其它

给真真新人的建议: 创建命令很烦的吧, 我又不想去学, 去配置cmake tools插件的用法, 而且这插件又冗余也不能在shell里用, 那怎么办呢, 在~/.bashrc(我用的zsh, 那应该是.zshrc)里创建快捷命令.

我在~/atools下备份了一份模板, 然后在.zshrc(.bashrc)里设置快捷命令,

source ~/.proxy.sh set c7(){ cp -r /home/foo/atools/cmake_template/* . mv ./aavscode ./.vscode } c8(){ mkdir $1 && cp -r /home/foo/atools/cmake_template/* ./$1 mv ./$1/aavscode ./$1/.vscode } alias c0="cmake -B build" alias c1="cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=1" alias c2="cmake --build build -j20" alias c3="r0 && c1 && c2" alias c4="./build/main/main" alias r0="rm -rf ./build"

c7在当前目录下创建项目, 而c8 proj_name命令就能在当前目录下, 复制一个简单的cmake项目.



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有